import {
    login,
    logout,
    getInfo,
    getMenus
} from '@/api/login';

import {
    getToken,
    setToken,
    removeToken
} from '@/utils/auth';

import router, {
    resetRouter
} from '@/router';

import {
    Message
} from 'element-ui';

const state = {
    token: getToken(),
    name: '',
    avatar: '',
    introduction: '',
    roles: [],
    menus: []
};

const mutations = {
    SET_TOKEN: (state, token) => {
        state.token = token;
    },
    SET_INTRODUCTION: (state, introduction) => {
        state.introduction = introduction;
    },
    SET_NAME: (state, name) => {
        state.name = name;
    },
    SET_AVATAR: (state, avatar) => {
        state.avatar = avatar;
    },
    SET_ROLES: (state, roles) => {
        state.roles = roles;
    },
    SET_MENUS: (state, menus) => {
        state.menus = menus;
    }
};

const actions = {
    // user login
    login({ commit }, userInfo) {
        const { username, password } = userInfo;
        return new Promise((resolve, reject) => {
            login({ admin_name: username.trim(), password: password }).then(response => {
                const { data } = response;
                Message({
                    message: response.msg,
                    type: 'success',
                    duration: 1500
                });

                commit('SET_TOKEN', data.access_token);
                setToken(data.access_token);

                console.log('登录完成 - login - end');
                resolve();
            }).catch(error => {
                reject(error);
            });
        });
    },

    // get user info
    getInfo({ commit, state }) {
        console.log('获取基本信息 - getInfo');
        return new Promise((resolve, reject) => {
            getInfo(state.token).then(response => {
                const { data } = response;

                if (!data) {
                    reject('Verification failed, please Login again.');
                }

                const { roles, admin_name, admin_head } = data;

                // 强行定义：路由权限后端做了处理，前端如何没有权限就不会展示菜单栏目 === vue的路由
                roles.push('admin');
                roles.push('editor');

                // roles must be a non-empty array
                if (!roles || roles.length <= 0) {
                    reject('getInfo: roles must be a non-null array!');
                }

                commit('SET_ROLES', roles);
                commit('SET_NAME', admin_name);
                commit('SET_AVATAR', admin_head);
                commit('SET_INTRODUCTION', admin_name);
                resolve(data);
            }).catch(error => {
                reject(error);
            });
        });
    },

    // user logout
    logout({ commit, state, dispatch }) {
        return new Promise((resolve, reject) => {
            logout(state.token).then(() => {
                commit('SET_TOKEN', '');
                commit('SET_ROLES', []);
                removeToken();
                resetRouter();

                // reset visited views and cached views
                // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
                dispatch('tagsView/delAllViews', null, { root: true });

                resolve();
            }).catch(error => {
                reject(error);
            });
        });
    },

    // remove token
    resetToken({ commit }) {
        return new Promise(resolve => {
            commit('SET_TOKEN', '');
            commit('SET_ROLES', []);
            removeToken();
            resolve();
        });
    },

    // dynamically modify permissions
    async changeRoles({ commit, dispatch }, role) {
        const token = role + '-token';

        commit('SET_TOKEN', token);
        setToken(token);

        const { roles } = await dispatch('getInfo');

        resetRouter();

        // generate accessible routes map based on roles
        const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true });
        // dynamically add accessible routes
        router.addRoutes(accessRoutes);

        // reset visited views and cached views
        dispatch('tagsView/delAllViews', null, { root: true });
    }
};

export default {
    namespaced: true,
    state,
    mutations,
    actions
};
